package io.mvvm.ws.chain;

import io.mvvm.ws.entity.RequestInfo;
import io.mvvm.ws.entity.ResponseInfo;
import io.mvvm.ws.exception.NoMessageHandlerException;
import io.netty.channel.ChannelHandlerContext;

/**
 * @program: Netty
 * @description: 消息处理链
 * @author: 潘
 * @create: 2021-04-28 19:31
 **/
public abstract class MessageHandler {
    /**
     * 下一个处理器
     */
    private MessageHandler next;

    /**
     * 获取下一个处理器
     * @return  下一个处理器
     */
    protected MessageHandler getNext() {
        return this.next;
    }

    /**
     * 设置下一个处理器
     * @param next  处理器
     */
    protected void setNext(MessageHandler next) {
        this.next = next;
    }

    /**
     * 当前处理器是否符合执行条件
     * @param request   请求实体
     * @return
     */
    protected abstract boolean isMatched(RequestInfo request);

    /**
     * 处理器
     * @param request   请求参数
     * @param ctx       Channel 上下文信息
     * @return          响应实体
     */
    protected abstract ResponseInfo handler(RequestInfo request, ChannelHandlerContext ctx);

    /**
     * 启动处理器
     * @param request   请求参数
     * @param ctx       Channel 上下文
     * @return          处理器执行结果
     */
    public final ResponseInfo start(RequestInfo request, ChannelHandlerContext ctx) {
        if (this.isMatched(request)) {
            return this.handler(request, ctx);
        } else {
            if (null != this.next) {
                return this.next.start(request, ctx);
            }
            throw new NoMessageHandlerException("没有可执行处理器", request);
        }
    }

}
